package br.com.toscano.contpedido.domain;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import br.com.toscano.contpedido.view.filter.ConfiguracaoFilter;

@Entity
@Table(name="CLIENTE")
public class Cliente extends ObjetoAbstrato {
	private static final long serialVersionUID = 13454534543354534L;
	
	public static final Byte TIPO_PAGAMENTO_A_VISTA = 1; 
	public static final Byte TIPO_PAGAMENTO_FATURADO = 0; 

	@Id
	@Column(name="CLIE_ID")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@Column(name="CLIE_NOME", nullable=false, length=100)
	private String nome;
	
	@Column(name="CLIE_FONE", nullable=false)
	private String fone;

	@Column(name="CLIE_CPF", nullable=false)
	private String cpf;

	@Column(name="CLIE_ENDERECO", nullable=false)
	private String endereco;

	@Column(name="CLIE_COMPLEMENTO", nullable=true)
	private String complemento;

	@Column(name="CLIE_REFERENCIA", nullable=true)
	private String referencia;

	@Column(name="CLIE_CEP", nullable=true)
	private String cep;
	
	@Column(name="CLIE_RESPONSAVEL", nullable=false)
	private String responsavel;

	@Column(name="CLIE_FONE2", nullable=true)
	private String fone2;

	@Column(name="CLIE_EMAIL", nullable=true)
	private String email;
	
	@Column(name="CLIE_FONE3", nullable=true)
	private String fone3;
	
	@Column(name="CLIE_BAIRRO", nullable=false)
	private String bairro;

	@Column(name="CLIE_CIDADE", nullable=false)
	private String cidade;

	@Column(name="CLIE_ESTADO", nullable=false)
	private String estado;
	
	@Column(name = "CLIE_TIPO_PAGAMENTO", nullable = false)	
	private Byte tipoPagamento = TIPO_PAGAMENTO_FATURADO;

	@Column(name = "PROD_DESCONTO", nullable = false, precision = 19, scale = 2)
	private BigDecimal desconto = BigDecimal.ZERO;
	
	@Column(name = "CLIE_RESGATA_ULTIMO_PEDIDO", nullable = false)	
	private Byte resgataUltimoPedido = null;
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cliente", orphanRemoval = true)
	private List<Pedido> listaPedidos = new ArrayList<Pedido>(0);

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cliente", orphanRemoval = true)
	private List<Recebimento> listaRecebimentos = new ArrayList<Recebimento>(0);

	public List<Pedido> getListaPedidos() {
		return listaPedidos;
	}

	public void setListaPedidos(List<Pedido> listaPedidos) {
		this.listaPedidos = listaPedidos;
	}

	public List<Recebimento> getListaRecebimentos() {
		return listaRecebimentos;
	}

	public void setListaRecebimentos(List<Recebimento> listaRecebimentos) {
		this.listaRecebimentos = listaRecebimentos;
	}

	public Cliente() {
		super();
	}

	public int hashCode() {
		StringBuffer sb = new StringBuffer();
		
		sb.append(this.getId());
		
		return sb.toString().hashCode();
	}
	
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cliente other = (Cliente) obj;
		 if ((id == null && other.id == null) || (id == 0 && other.id == 0)) {
				return true;
		}else if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id)) {
			return false;
		}
		return true;
	}



	public Long getId() {
		return id;
	}



	public void setId(Long id) {
		this.id = id;
	}



	public String getNome() {
		return nome;
	}



	public void setNome(String nome) {
		this.nome = nome;
	}



	public String getFone() {
		return fone;
	}



	public void setFone(String fone) {
		this.fone = fone;
	}



	public String getCpf() {
		return cpf;
	}



	public void setCpf(String cpf) {
		this.cpf = cpf;
	}



	public String getEndereco() {
		return endereco;
	}



	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}



	public String getComplemento() {
		return complemento;
	}



	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}



	public String getCidade() {
		return cidade;
	}



	public void setCidade(String cidade) {
		this.cidade = cidade;
	}



	public String getEstado() {
		return estado;
	}



	public void setEstado(String estado) {
		this.estado = estado;
	}



	public String getReferencia() {
		return referencia;
	}



	public void setReferencia(String referencia) {
		this.referencia = referencia;
	}



	public String getResponsavel() {
		return responsavel;
	}



	public void setResponsavel(String responsavel) {
		this.responsavel = responsavel;
	}



	public String getFone2() {
		return fone2;
	}



	public void setFone2(String fone2) {
		this.fone2 = fone2;
	}



	public String getFone3() {
		return fone3;
	}
	public void setFone3(String fone3) {
		this.fone3 = fone3;
	}

	public BigDecimal getDesconto() {
		return desconto;
	}
	public void setDesconto(BigDecimal desconto) {
		this.desconto = desconto;
	}
	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	public Byte getResgataUltimoPedido() {
		if (resgataUltimoPedido == null || (!resgataUltimoPedido.equals(SIM) && !resgataUltimoPedido.equals(NAO))) {
			resgataUltimoPedido = ConfiguracaoFilter.PADRAO_EXIBIR_HISTORICO_PEDIDO;
		}
		return resgataUltimoPedido;
	}

	public void setResgataUltimoPedido(Byte dados) {
		if (dados == null || (!dados.equals(SIM) && !dados.equals(NAO))) {
			dados = ConfiguracaoFilter.PADRAO_EXIBIR_HISTORICO_PEDIDO;
		}
		this.resgataUltimoPedido = dados;
	}

	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	public Byte getTipoPagamento() {
		return tipoPagamento;
	}

	public void setTipoPagamento(Byte tipoPagamento) {
		this.tipoPagamento = tipoPagamento;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
}